var reg = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X|x)$/;

String.prototype.trim=function(){return this.replace(/(^\s+)|(\s+$)/g,'')};

/**
 * 验证身份证号码是否为空、地区是否正确、年龄是否正确以及最后一位校验位是否校验通过
 * @param str 待验证的身份证号码
 * @returns {number}
 * 0：身份证号码为空；
 * 1：身份证号码有效；
 * 2：身份证号码错误
 */
function validateIdNumber(str) {
    if (str.trim() === "") {
        return 0;
    } else if (checkCard(str)) {
        return 1;
    } else {
        return 2;
    }
}

var vcity={ 11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",
    21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",
    33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",
    42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",
    51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",
    63:"青海",64:"宁夏",65:"新疆"
};

checkCard = function(obj)
{
    return isCardNo(obj) && checkProvince(obj) && checkBirthday(obj) && checkParity(obj);
};
/**
 * 检查身份证号码长度和每一位的数据类型
 * @param obj 身份证号码
 * @returns {boolean}
 * true：总长度18位，且最后一位为数字或者x（大小写均可）
 * false：其他情况
 */
isCardNo = function(obj)
{
    return reg.test(obj) !== false;
};
/**
 * 取身份证前两位,校验省份信息是否正确
 * @param obj 身份证号码
 * @returns {boolean}
 * true：省份信息正确
 * false：省份信息错误
 */
checkProvince = function(obj)
{
    var province = obj.substr(0,2);
    return vcity[province] != undefined;

};

/**
 * 检查身份证上的出生日期是否正确，出生日期本身是有效的年月日，并且年龄不能超过130岁
 * @param obj 身份证号码
 * @returns {boolean}
 * true：出生日期正确
 * false：出生日期错误
 */
checkBirthday = function(obj)
{
    /**
     * 身份证18位时，次序为省（3位）市（3位）年（4位）月（2位）日（2位）校验位（4位），校验位末尾可能为X
     */
    var arr_data = obj.match(reg);
    var year = arr_data[2];
    var month = arr_data[3];
    var day = arr_data[4];
    var birthday = new Date(year+'/'+month+'/'+day);
    return verifyBirthday(year,month,day,birthday);
};

/**
 * 校验日期
 * @param year
 * @param month
 * @param day
 * @param birthday
 * @returns {boolean}
 */
verifyBirthday = function(year,month,day,birthday)
{
    var now = new Date();
    var now_year = now.getFullYear();
    /**
     * 年月日是否合理
     */
    if(birthday.getFullYear() == year && (birthday.getMonth() + 1) == month && birthday.getDate() == day)
    {
        var time = now_year - year;
        if(time >= 0 && time <= 130)
        {
            return true;
        }
        return false;
    }
    return false;
};

/**
 * 校验身份证最后一位是否正确
 * @param obj 身份证号码
 * @returns {boolean}
 * true：最后一位正确
 * false：最后一位错误
 */
checkParity = function(obj)
{
    var len = obj.length;
    if(len == '18')
    {
        var arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
        var arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
        var cardTemp = 0, i, valNum;
        for(i = 0; i < 17; i ++)
        {
            cardTemp += obj.substr(i, 1) * arrInt[i];
        }
        valNum = arrCh[cardTemp % 11];
        return valNum == obj.substr(17, 1).toUpperCase();

    }
    return false;
};